package _tema6;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class PanelControlCliente extends JFrame {

	private static final long serialVersionUID = 1L;
	private int serverPort = 7920;
	private String serverHost = "127.0.0.1";

	/*Componentes*/
	private MenuItem mniObtenerSP;
	private MenuItem mniEjecutarSP;
	private MenuItem mniFinalizar;
	private JComboBox jcbSP;
	private JTable jtbResultados;
	private JRadioButton jrbZona1;
	private JRadioButton jrbZona2;
	private JRadioButton jrbCat85;
	private JRadioButton jrbCat84;
	private JLabel jlbEstado;	
	
	
	/* Cliente */
	private Cliente cliente = new Cliente(this.serverHost,this.serverPort);
	
	
	public PanelControlCliente(){
		this.componentes();
		this.propiedades();
	}
	
	
	private void componentes() {
		this.componenteMenu();
		Container c = this.getContentPane();
		c.setLayout(new BorderLayout());
		
		/*Creamos un panel para el Norte*/
		JPanel jpnNorte = new JPanel(new GridLayout(1,2));
		jpnNorte.add(new JLabel("Procedimientos:"));
		/*Creamos un ComboBox*/
		this.jcbSP = new JComboBox();
		this.jcbSP.setPreferredSize(new Dimension(120,18));
		jpnNorte.add(this.jcbSP);
		c.add(jpnNorte, BorderLayout.NORTH);
		
		/*Creamos el Panel del Centro*/
		JPanel jpnCentro = new JPanel(new BorderLayout());
		jpnCentro.setPreferredSize(new Dimension(320,240));
		c.add(jpnCentro,BorderLayout.CENTER);
		
		this.jtbResultados = new JTable();
		
		jpnCentro.add(this.jtbResultados.getTableHeader(),BorderLayout.NORTH);
		jpnCentro.add(new JScrollPane(this.jtbResultados),BorderLayout.CENTER);
		
		/*Creamos el Panel de Sur*/
		JPanel jpnSur = new JPanel(new GridLayout(2,1));
		c.add(jpnSur,BorderLayout.SOUTH);
		
		this.jrbZona2 = new JRadioButton("Zona 2");
		this.jrbZona1 = new JRadioButton("Zona 1");
		this.jrbZona1.setSelected(true);
		
		this.jrbCat84 = new JRadioButton("Categoria 84");
		this.jrbCat85 = new JRadioButton("Categoria 85");
		this.jrbCat85.setSelected(true);

		
		ButtonGroup jbgZona = new ButtonGroup();
		jbgZona.add(this.jrbZona1);
		jbgZona.add(this.jrbZona2);
		
		ButtonGroup jbgCategoria = new ButtonGroup();
		jbgCategoria.add(this.jrbCat85);
		jbgCategoria.add(this.jrbCat84);
		
		/*Creamos un Panel para las Zonas*/
		JPanel jpnZonas = new JPanel(new GridLayout(1,2));
		jpnZonas.setBorder(BorderFactory.createEtchedBorder());
		jpnZonas.add(this.jrbZona1);
		jpnZonas.add(this.jrbZona2);

		
		/*Creamos un Panel para las Categorias*/
		JPanel jpnCat = new JPanel(new GridLayout(1,2));
		jpnCat.setBorder(BorderFactory.createEtchedBorder());
		jpnCat.add(this.jrbCat85);
		jpnCat.add(this.jrbCat84);
		
		
		/*Creamos un Panel para Sur Norte*/
		
		JPanel jpnSurNorte = new JPanel(new GridLayout(1,2));
		
		jpnSurNorte.add(jpnCat);
		jpnSurNorte.add(jpnZonas);		
		
		jpnSur.add(jpnSurNorte);
		
		
		/*Creamos un Panel para el Sur Sur*/
		JPanel jpnSurSur = new JPanel(new FlowLayout());
		jpnSurSur.setBorder(BorderFactory.createEtchedBorder());
		this.jlbEstado = new JLabel("");
		jpnSurSur.add(this.jlbEstado);
		jpnSur.add(jpnSurSur);
	}

	
	private void componenteMenu(){
		MenuBar mb = new MenuBar();

		Menu mnArchivo = new Menu("Archivo");
		
		this.mniObtenerSP = new MenuItem("Obtener procedimientos");
		this.mniEjecutarSP = new MenuItem("Ejecutar procedimientos");
		this.mniFinalizar = new MenuItem("Finalizar");
		
		this.mniEjecutarSP.setEnabled(false);
		
		
		mnArchivo.add(this.mniObtenerSP);
		mnArchivo.addSeparator();
		mnArchivo.add(this.mniEjecutarSP);
		mnArchivo.addSeparator();
		mnArchivo.add(this.mniFinalizar);
		mb.add(mnArchivo);
		this.setMenuBar(mb);

		/*Creamos los Listeners para cada MenuItem*/
		this.mniObtenerSP.addActionListener(new ActionListener(){
			PanelControlCliente p = PanelControlCliente.this;
			
			public void actionPerformed(ActionEvent e) {
					try {
						p.cliente.conectar();
						Respuesta respuestaAux = p.cliente.obtenerSP();
						p.jlbEstado.setText("Seleccione las opciones y ejecute un procedimiento...");
						p.cargarSP(respuestaAux.getTitulos());
						p.mniEjecutarSP.setEnabled(true);
						
					} catch (UnknownHostException e1) {
						p.jlbEstado.setText(e1.getMessage());
					} catch (IOException e2) {
						p.jlbEstado.setText(e2.getMessage());
					} catch (Exception e3) {
						// TODO Auto-generated catch block
						p.jlbEstado.setText(e3.getMessage());
					}
			}
		});
		this.mniEjecutarSP.addActionListener(new ActionListener(){
			PanelControlCliente p = PanelControlCliente.this;
			
			public void actionPerformed(ActionEvent e) {
				String sp = p.jcbSP.getSelectedItem().toString();
				int[] argumentos = new int[2];
				argumentos[0]=(p.jrbZona1.isSelected())?(1):(2);
				argumentos[1]=(p.jrbCat84.isSelected())?(84):(85);
				
				try {
					Respuesta auxRespuesta = p.cliente.ejecutarSP(sp,argumentos);
					p.mostrarResultados(auxRespuesta.getTitulos(),auxRespuesta.getDatos());
				} catch (Exception e1) {
					p.jlbEstado.setText(e1.getMessage());
				}
			}
		});
		this.mniFinalizar.addActionListener(new ActionListener(){
			PanelControlCliente p = PanelControlCliente.this;
			public void actionPerformed(ActionEvent e) {
				p.finalizar();
			}
		});
	}
	

	protected void mostrarResultados(Object[] titulos, final Object[][] datos) {
		/*Creamos un JTableHeade */
		this.jtbResultados.setModel(new DefaultTableModel(datos,titulos){
			private static final long serialVersionUID = 1L;
			public Object getValueAt(int row, int column) {
				return datos[row][column];
			}
			public boolean isCellEditable(int row, int column) {
				// TODO Auto-generated method stub
				return false;
			}
		});
		
	}


	protected void cargarSP(Object[] sps) {
		for(int i = 0;i<sps.length;i++) this.jcbSP.addItem((String)sps[i]);
		
	}


	public void propiedades(){
		this.setTitle("Cliente => Servidor ["+this.serverHost+":"+this.serverPort+"]");
		this.addWindowListener(new WindowAdapter(){
			PanelControlCliente p = PanelControlCliente.this;
			
			public void windowClosing(WindowEvent e) {
				p.finalizar();
			
			}
		});
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		this.pack();
	}
	
	protected void finalizar() {
		try {
			this.cliente.cerrarConexion();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			this.jlbEstado.setText(e.getMessage());
		}
		System.exit(0);
	}


	public String getServerHost() {
		return this.serverHost;
	}

	public int getServerPort() {

		return this.serverPort;
	}

	public static void main(String[] args) {
		new PanelControlCliente().setVisible(true);
	}

}
